package com.example.chao.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.chao.component.*;
import com.example.chao.dto.ChaoDTO;
import com.example.chao.entity.Chao;
import com.example.chao.result.Result;
import com.example.chao.result.ResultUtil;
import com.example.chao.service.ChaoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.text.ParseException;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: WangYongChao
 * @Date: 2021/08/10/20:25
 * @Description: 功能测试
 */
@RestController
@RequestMapping("/chao")
@Api(value = "text" ,tags = {"功能测试"})
public class ChaoController {

    @Autowired
    private ChaoService chaoService;
    @Autowired
    private SqlSessionFactory sqlSessionFactory;

    /**
     *字符串替换
     * @param s 原字符串
     * @return 处理后的字符串
     */
    @ApiOperation("字符串替换")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "s", value = "字符串s",required = true, paramType = "String", dataType = "String"),
    })
    @PostMapping("/replaceString")
    public Result replaceString(String s) {
        String a = "${{";
        String b = "}}";
        List<Integer> aplace = StringManageUtil.KMP(s, a);//"${"字符串的位置
        List<Integer> bplace = StringManageUtil.KMP(s, b);//"}"字符串的位置
        if(aplace.size()==0||bplace.size()==0){  //格式判断，是否符合“${{}}”格式
            return ResultUtil.error("格式错误");
        }
        List<String> list=new ArrayList<>();
        for(int i=0;i< aplace.size();i++){ //循环取出全部
            String s1=s.substring(aplace.get(i)+3,bplace.get(i));//取出$"{{}}"里面的字符串
            list.add(chaoService.selectValue(s1));//将s1作为参数，执行selectValue方法
        }
        String temp=s.substring(0,aplace.get(0));//截取第一个到第一个"${{"之间的字符串
        temp+=list.get(0);
        for(int i=1;i< aplace.size();i++){
            temp+=s.substring(bplace.get(i-1)+2,aplace.get(i));//截取“}}”到下一个“${{”之间的字符串
            temp+=list.get(i);
        }
        temp+=s.substring(bplace.get(bplace.size()-1)+2,s.length());//截取最后一个“}}”后面的字符串
        return ResultUtil.success(temp);
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 分页测试
     *
     * @param chaoDTO
     * @return
     */
    @ApiOperation("分页测试")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "pageNo", value = "分页", required = true, paramType = "String", dataType = "String"),
            @ApiImplicitParam(name = "pageSize", value = "分页", required = true, paramType = "String", dataType = "String"),
    })
    @PostMapping("/selectAllPage")
    public Result<Chao> selectAll(ChaoDTO chaoDTO) {
        IPage<Chao> page = chaoService.selectAll(chaoDTO);
        return ResultUtil.success(page);

    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 时间格式处理
     * @param str 字符串
     * @return
     */
    @ApiOperation("时间字符串处理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "str", value = "字符串",required = true, paramType = "String", dataType = "String"),
    })
    @PostMapping("/dateParse")
    public Result<Date> dateParse(String str){
        Date date= DateManageUtil.parseDate(str);
        return ResultUtil.success(date);
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 时间段字符串处理
     * @param str
     * @return
     */
    @ApiOperation("时间段字符串处理")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "str", value = "字符串",required = true, paramType = "String", dataType = "String"),
    })
    @PostMapping("/formatTime")
    public Result formatTime(String str){
        List<Date> dates=DateManageUtil.formatTime(str);
        List<Date> dateList=new ArrayList<>();
        Date date1=dates.get(0);
        Date date2=dates.get(1);
        dateList.add(date1);
        dateList.add(date2);
        return ResultUtil.success(dateList);
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * sql校验
     * @param sql sql字符串
     * @return
     */
    @ApiOperation("sql校验")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "sql", value = "sql字符串",required = true, paramType = "String", dataType = "String"),
    })
    @PostMapping("/checkSql")
    public Result checkSql(String sql){
        try {
            String sqls=sql.trim();
            String str=sqls.substring(0,6);
            if (str.equalsIgnoreCase("select")){ //忽略大小写判断是否为select语句
                return ResultUtil.success(chaoService.checkSql(sql));
            }else {
                return ResultUtil.error("只能是查询语句");
            }
        }catch (Exception e){
            return ResultUtil.error();
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 文件上传
     * @param  file 文件
     * @return
     */
    @ApiOperation("文件上传")
    @ApiImplicitParams({
          //  @ApiImplicitParam(name = "file", value = "文件",required = true, paramType = "String", dataType = "String"),
    })
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file){
       return FileManageUtil.upload(file);
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 购买者信息查询Map类型参数
     *
     * @param reqMap
     * @return
     */
    @ApiOperation("信息查询")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "reqMap", value = "用户id", required = true, paramType = "body", dataType = "Object")
    })
    @PostMapping("/checkuser")
    public Map<String, Object> orderdto(@RequestBody Map<String, Object> reqMap) {
        System.out.println(reqMap);
        return chaoService.orderdto(reqMap);

    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 批量插入
     * @param dataList
     * @param limit
     */
    @ApiOperation("批量插入")
    @ApiImplicitParams({
            //           @ApiImplicitParam(name = "reqMap", value = "用户id",required = true, paramType = "body", dataType = "Object")
    })
    @PostMapping("/batchInsert")
    @Transactional
    public Result batchInsert(@RequestBody List<Map<String,Object>> dataList, int limit) {
        Long startDate =System.currentTimeMillis();//自1970年1月1日到目前的毫秒数
        System.out.println("开始时间"+startDate);
        SqlSession sqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH);
        try {
            for (int i=1;i<dataList.size()+1;i++){
                sqlSession.insert("com.example.chao.mapper.ChaoMapper.batchInsert",dataList.get(i-1));
                if (1%limit==0){
                    sqlSession.commit();
                    sqlSession.clearCache();
                    return ResultUtil.success("第"+i/limit+"次提交");
                }
            }
            if (dataList.size()+1%limit!=0){
                sqlSession.commit();
                sqlSession.clearCache();
            }

        }catch (Exception e){
            return ResultUtil.error("批量操作插入异常");
        }finally {
            sqlSession.close();

        }
        int size=dataList.size();
        Long endDate=System.currentTimeMillis();
        return ResultUtil.success("结束时间"+endDate+"插入数据"+size);

    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 批量查询
     * @param
     * @param reMap
     * @return
     */
/*    @ApiOperation("批量查询")
    @ApiImplicitParams({
            //           @ApiImplicitParam(name = "reqMap", value = "用户id",required = true, paramType = "body", dataType = "Object")
    })
    @PostMapping("/batchSelect")

    public Result batchSelect(@RequestBody List<Map<String,Object>> dataList,int limit) {
        System.out.println(dataList);
        Long startDate =System.currentTimeMillis();
        for (int i=1;i<dataList.size()+1;i++){
            List<Map<String,Object>> list=chaoService.batchSelect(dataList.get(i-1));
                return ResultUtil.success(list);
            }
        Long endDate=System.currentTimeMillis();
        return ResultUtil.error();
    public  Result batchSelect(@RequestBody  List<Map<String,Object>> reMap) {
        List<Map<String,Object>> list=chaoService.batchSelect(reMap);
        return ResultUtil.success(list);

    }*/

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 批量更新
     * @param dataList
     * @param limit
     */
    @ApiOperation("批量更新")
    @ApiImplicitParams({
            //           @ApiImplicitParam(name = "reqMap", value = "用户id",required = true, paramType = "body", dataType = "Object")
    })
    @PostMapping("/batchUpdate")
    @Transactional
    public Result batchUpdate(@RequestBody List<Map<String,Object>> dataList, int limit) {
        Long startDate =System.currentTimeMillis();//自1970年1月1日到目前的毫秒数
        System.out.println("开始时间"+startDate);
        SqlSession sqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH);
        try {
            for (int i=1;i<dataList.size()+1;i++){
                sqlSession.update("com.example.chao.mapper.ChaoMapper.batchUpdate",dataList.get(i-1));
                if (1%limit==0){
                    sqlSession.commit();
                    sqlSession.clearCache();
                    return ResultUtil.success("第"+i/limit+"次提交");
                }
            }
            if (dataList.size()+1%limit!=0){
                sqlSession.commit();
                sqlSession.clearCache();
            }

        }catch (Exception e){
            return ResultUtil.error("批量操作更新异常");
        }finally {
            sqlSession.close();

        }
        int size=dataList.size();
        Long endDate=System.currentTimeMillis();
        return ResultUtil.success("结束时间"+endDate+"更新数据"+size);

    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 批量删除
     * @param dataList
     * @param limit
     */
    @ApiOperation("批量删除")
    @ApiImplicitParams({
            //           @ApiImplicitParam(name = "reqMap", value = "用户id",required = true, paramType = "body", dataType = "Object")
    })
    @PostMapping("/batchDelete")
    @Transactional
    public Result batchDelete(@RequestBody List<Map<String,Object>> dataList, int limit) {
        Long startDate =System.currentTimeMillis();//自1970年1月1日到目前的毫秒数
        System.out.println("开始时间"+startDate);
        SqlSession sqlSession=sqlSessionFactory.openSession(ExecutorType.BATCH);
        try {
            for (int i=1;i<dataList.size()+1;i++){
                sqlSession.delete("com.example.chao.mapper.ChaoMapper.batchDelete",dataList.get(i-1));
                if (1%limit==0){
                    sqlSession.commit();
                    sqlSession.clearCache();
                    return ResultUtil.success("第"+i/limit+"次提交");
                }
            }
            if (dataList.size()+1%limit!=0){
                sqlSession.commit();
                sqlSession.clearCache();
            }

        }catch (Exception e){
            return ResultUtil.error("批量操作删除异常");
        }finally {
            sqlSession.close();

        }
        int size=dataList.size();
        Long endDate=System.currentTimeMillis();
        return ResultUtil.success("结束时间"+endDate+"删除数据"+size);

    }


    /**
     * 时间差（秒）
     * @param start
     * @param end
     * @return
     */
    @ApiOperation("时间差（秒/分/时/天）")
    @ApiImplicitParams({
       //     @ApiImplicitParam(name = "start", value = "前时间",required = true, paramType = "Date", dataType = "Date"),
        //    @ApiImplicitParam(name = "end", value = "后时间",required = true, paramType = "Date", dataType = "Date")
    })
    @PostMapping("/timeDifference")
    public Result<Date> timeDifference(String start, String end,String format) throws ParseException {
        if (start.matches("[0-9]+")&&end.matches("[0-9]+")){
            return ResultUtil.success(DateManageUtil.timeDifferenceSecond(DateManageUtil.parseDate(start),DateManageUtil.parseDate(end)));
        }
        Date starts=DateManageUtil.parseDates(start,format);
        Date ends=DateManageUtil.parseDates(end,format);
        System.out.println(starts);
        System.out.println(ends);
        return ResultUtil.success(DateManageUtil.timeDifferenceSecond(starts,ends));//天

    }
}


